package com.hoki.zj.hrm.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import static com.hoki.zj.hrm.constant.MQMessageConst.*;

@Configuration
public class MQConfig {

    /**
     * 创建交换机
     *  指定类型
     *  指定名字
     * @return Exchange
     */
    @Bean
    public Exchange createExchange() {
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME_MQ).build();
    }

    /**
     * 创建手机短信队列,默认持久
     * @return Queue
     */
    @Bean
    public Queue createSMSQueue() {
        return new Queue(QUEUE_NAME_SMS);
    }

    /**
     * 创建邮箱队列,默认持久
     * @return Queue
     */
    @Bean
    public Queue createEmailQueue() {
        return new Queue(QUEUE_NAME_EMAIL);
    }

    /**
     * 创建站内信队列,默认持久
     * @return Queue
     */
    @Bean
    public Queue createSMSGQueue() {
        return new Queue(QUEUE_NAME_SMSG);
    }

    /**
     * 绑定短信队列
     * @return Binding
     */
    @Bean
    public Binding bindSMSQueue() {
        return BindingBuilder.bind(createSMSQueue()). // 指定绑定的队列
                to(createExchange()). // 指定绑定的交换机
                with("#.sms"). // 指定绑定的路由
                noargs(); // 无额外参数
    }

    /**
     * 绑定邮箱队列
     * @return Binding
     */
    @Bean
    public Binding bindEmailQueue() {
        return BindingBuilder.bind(createEmailQueue()). // 指定绑定的队列
                to(createExchange()). // 指定绑定的交换机
                with("#.email"). // 指定绑定的路由
                noargs(); // 无额外参数
    }

    /**
     * 绑定站内信队列
     * @return Binding
     */
    @Bean
    public Binding bindSMSGQueue() {
        return BindingBuilder.bind(createSMSGQueue()). // 指定绑定的队列
                to(createExchange()). // 指定绑定的交换机
                with("#.smsg"). // 指定绑定的路由
                noargs(); // 无额外参数
    }

    /**
     * 配置json转换器
     * @param connectionFactory 连接工厂
     * @return RabbitTemplate
     */
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
        rabbitTemplate.setMandatory(true);
        return rabbitTemplate;
    }
}
